//******************************************************************************
//
// ATM系统 -  Transaction.java 
// 参考了 http://www.cs.gordon.edu/courses/cs211/ATMExample/index.html
// 
//******************************************************************************

package atm;

import domain.Bcard;

/**
* 这个Transaction类是所有交易类的父类。当用户选择一个交易（取款，存款，查询）时，
* 会实例化相应的交易类。 
* @author  何希
* @version 10/06/2018
*/
public class Transaction {
	
	public static final int TRANS_UNSTART = 1; // 未开始

	
	public static final int TYPE_EXIT = 0; // 退出交易
	public static final int TYPE_WITHDRAW = 1; // 取款交易
	public static final int TYPE_DEPOSIT = 2; // 存款交易
	public static final int TYPE_FINMONEY = 3; // 查询余额
	public static final int TYPE_TRANSFER = 4; // 查询余额
	public static final int TYPE_PAYMENT = 5; // 代缴费
	public static final int TYPE_CHAGEPWD = 6; // 修改密码
	
	// 会话的状态
	private int state = TRANS_UNSTART;
	//相关的账户
//	private Account acct = null;
	private Bcard bcard = null;
	
	static Bcard cardDao = Bcard.bcard();
	// 对应的对话
	private Session session;
	// 金额的大小
	private double amount = 0.0;
	// 判断卡号存在（转账用）
	private String TcardNo ;
	
	/**
	 * 根据用户的选择，生成一个交易子类
	 * @param session
	 * @param acct
	 * @param options
	 * @return
	 */
	public static Transaction makeTransaction(Session session, Bcard bcard, int options) {
		Transaction tmp = null;
		ATM machine = ATM.getInstance();
		switch(options) {
			case TYPE_WITHDRAW: //取钱
				tmp = new Withdraw(session,bcard);
				break;
			case TYPE_DEPOSIT:  //存款
				tmp = new Deposit(session,bcard);
				break;
			case TYPE_FINMONEY:  //查询余额
				tmp = new FindMoney(session,bcard);
				break;
			case TYPE_TRANSFER:  //转账
				tmp = new Transfer(session,bcard);
				break;
			case TYPE_PAYMENT:  //代缴费
				tmp = new Payment(session,bcard);
				break;
			case TYPE_CHAGEPWD:  //修改密码
				tmp = new ChangePwd(session,bcard);
				break;
			case TYPE_EXIT: //关机
				// 插卡孔状态要变 开关按钮状态要变 显示屏状态要变 数字键盘状态要变
				machine.setState(ATM.IDLE);
				machine.getCardSlot().eject();
				machine.getSwitchButton().stateChange(ATM.IDLE);
				machine.getDisplay().setText("请插入你的银行卡");
				machine.getArea().setText("");
				machine.getDigitButton().stateChange(2, 0, "");
				break;
			default :
				machine.getDisplay().setText("请选择业务 1:取款 2:存款 3:查询余额 4:转账 5:代缴费 6:修改密码  0:退出 ");
				machine.getDigitButton().stateChange(0, 0, "TransactionServlet");
				break;
		}
		return tmp;
	}
	
	
	/**
	 * 取款
	 * 把执行用户的请求,在Withdraw中已重写方法
	 */
	public void execute() {
		
	}
	
	
	/**
	 * 存款
	 * 把执行用户的请求,在Deposit中已重写方法   
	 */
	public void execute1() {
		
	}
	
	/**
	 * 
	     * @Title: TransferIsCard
	     * @author Huang_shengjun
	     * @Description: 查询是否存在卡号
	     * @param  参数
	     * @return void 返回类型
	     * @date 2020年5月29日 下午4:41:01
	     * @throws
	 */
	public void TransferIsCard(){
		
	}
	
	/**
	 * 
	     * @Title: changepwd
	     * @author Huang_shengjun
	     * @Description: 再次输入密码验证
	     * @param @param pwd 参数
	     * @return void 返回类型
	     * @date 2020年5月29日 下午8:37:52
	     * @throws
	 */
	public void changepwd(int pwd) {
		
	}
	
	/**
	 * 
	     * @Title: changepwdtwo
	     * @author Huang_shengjun
	     * @Description: 验证并修改密码
	     * @param @param pwd 参数
	     * @return void 返回类型
	     * @date 2020年5月29日 下午8:43:08
	     * @throws
	 */
	public void changepwdtwo(int pwd) {
		
	}
	
	/**
	 * 
	     * @Title: changepwdprint
	     * @author Huang_shengjun
	     * @Description: 选择退卡和返回界面
	     * @param @param flag 参数
	     * @return void 返回类型
	     * @date 2020年5月29日 下午8:38:12
	     * @throws
	 */
	public void changepwdprint(int flag) {
		
	}
	
	/**
	 * 
	     * @Title: TransferMoney
	     * @author Huang_shengjun
	     * @Description: 操作转账
	     * @param  参数
	     * @return void 返回类型
	     * @date 2020年5月29日 下午4:47:30
	     * @throws
	 */
	public void TransferMoney() {
		
	}
	
	/**
	 * 处理查询余额后返回首页
	 * @param 中已重写方法
	 */
	public void findmoney(int flag) {
		
	}
	
	/**
	 * 处理打印
	 * @param flag 0:打印 1:不打印 在Withdraw中已重写方法
	 */
	public void print(int flag) {
		
	}
	
	/**
	 * 处理打印
	 * @param flag 0:打印 1:不打印 在Deposit中已重写方法
	 */
	public void print1(int flag) {
		
	}
	
	/**
	 * 处理打印
	 * @param flag 0:打印 1:不打印 在Deposit中已重写方法
	 */
	public void print3(int flag) {
		
	}
	
	/**
	 * 
	     * @Title: paymentChoose
	     * @author Huang_shengjun
	     * @Description: 代缴费选择
	     * @param @param flag 参数
	     * @return void 返回类型
	     * @date 2020年5月30日 下午12:15:44
	     * @throws
	 */
	public void paymentChoose(int flag) {
		
	}
	
	//充值
	public void payment(int i) {
		
	}
	 
	//代缴打印
	public void paymentPrint(int flag) {
	
	}
	
	
	
	/**
	 * 获取金额
	 * @return
	 */
	public double getAmount() {
		return this.amount;
	}
	
	/**
	 * 
	 * @param amount
	 */
	public void setAmount(double amount) {
		this.amount = amount;
	}
	
	public Session getSession() {
		return this.session;
	}
	
//	public Account getAccount() {
//		return this.acct;
//	}
	
	
	public int getState() {
		return this.state;
	}
	
	public Bcard getBcard() {
		return bcard;
	}

	public void setBcard(Bcard bcard) {
		this.bcard = bcard;
	}

	public void setState(int state) {
		this.state = state;
	}
	
	public Transaction(Session session, Bcard bcard) {
		this.session = session;
		this.bcard = bcard;
	}

	public String getTcardNo() {
		return this.TcardNo;
	}

	public void setTcardNo(String tcardNo) {
		this.TcardNo = tcardNo;
	}
}
